package org.odata4j.examples.consumer;

import org.odata4j.consumer.ODataClientException;
import org.odata4j.consumer.ODataConsumer;
import org.odata4j.consumer.ODataConsumers;
import org.odata4j.consumer.ODataServerException;
import org.odata4j.core.Guid;
import org.odata4j.core.OEntity;
import org.odata4j.core.OProperties;
import org.odata4j.core.ORelatedEntitiesLink;
import org.odata4j.examples.AbstractExample;
import org.odata4j.internal.InternalUtil;

public class ODataValidatorExample extends AbstractExample {

  public static void main(String[] args) {
    ODataValidatorExample example = new ODataValidatorExample();
    example.run(args);
  }

  private void run(String[] args) {

    String uri = ODataEndpoints.NORTHWIND;

    ODataConsumer c = ODataConsumers.create("http://services.odata.org/validation/odatavalidator/");

    try {
      Guid validationJobId = Guid.fromString("f4aa9495-ef40-469e-818c-29c4ec5fb2ed");
      if (true) {
        OEntity newValidationJob = c.createEntity("ValidationJobs").properties(OProperties.string("Uri", uri), OProperties.string("Format", "atompub")).execute();
        reportEntity("new job", newValidationJob);
        validationJobId = (Guid) newValidationJob.getEntityKey().asSingleValue();
      }

      boolean complete = false;
      OEntity validationJob = null;
      while (!complete) {
        if (validationJob != null)
          InternalUtil.sleep(500);
        validationJob = c.getEntity("ValidationJobs", validationJobId).execute();
        complete = validationJob.getProperty("Complete", Boolean.class).getValue();
      }

      reportEntity("job", validationJob);
      for (OEntity testResult : c.getEntities(validationJob.getLink("TestResults", ORelatedEntitiesLink.class)).execute()) {
        reportEntity("result", testResult);
      }

      report("PayloadLines:");
      for (OEntity payloadLine : c.getEntities(validationJob.getLink("PayloadLines", ORelatedEntitiesLink.class)).orderBy("LineNumber").execute())
        report(payloadLine.getProperty("LineText", String.class).getValue());

    } catch (ODataServerException e) {
      reportError(e);
    } catch (ODataClientException e) {
      report("Client error: " + e.getMessage());
    }
  }

}
